***********************************************
*  Course: CS4613 Project
*  Title: Grammar Specification for UPC Script
*  Authors: Aleksandar Petrovic, Terry Sznober
***********************************************

The following is a peseudo EBNF description of the
grammar for UPC Script
---------------------------------------------------------

<program> --> <statement list>

<statement list> --> <statement>
                  |  <statement> <statement list>

<statement> --> <block>
             |  <variable declaration>
             |  <assignment>
             |  <if statement>
             |  <while statement>
             |  <drawLine statement>
             |  <drawRectangle statement>
             |  <drawCircle statement>
             |  <drawString statement>

<block> --> { <statement list> }

<variable declaration> --> var <identifier>;

<assignment> --> <identifier> = <expression>;

<if statement> --> if ( <expression> ) <statement> [else <statement>]

<while statement> --> while ( <expression ) <statement>

<drawLine statement> --> drawLine ( <expression>, <expression>, <expression>, <expression>, <color> );

<drawRectangle statement> --> drawRectangle ( <expression>, <expression>, <expression>, <expression>, <color> );

<drawCircle statement> --> drawCircle ( <expression>, <expression>, <expression>, <color> );

<drawString statement> --> drawString ( <expression>, <expression>, <identifier> | <string literal>, <color> );

<expression> --> <integer literal>
              |  <string literal>
              |  <identifier>
              | ( <expression> )
              |  <expression> <arithmetic operation> <expression>
              |  <expression> <relational operation> <expression>
              |  <expression> <logical operation> <expression>
              |  <unary operation> <expression>

<arithmetic operation> --> + | - | * | / | %
                         
<relational operation> --> < | > | <= | >= | == | !=
                                               
<logical operation> --> && | || 

<unary operation> --> - | !

<integer literal> --> 0 | {0-9}

<string literal> --> "[{a-Z}]"

<identifier> --> a-Z{a-Z|0-9}

<color> --> black | blue | cyan | gray | green | magenta | orange | pink | red | white | yellow